package com.zh.note.leetcode.array;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.IntFunction;
import java.util.stream.Collectors;

/**
 * 题目：最大数
 * 给定一组非负整数 nums，重新排列每个数的顺序（每个数不可拆分）使之组成一个最大的整数。
 * 注意：输出结果可能非常大，所以你需要返回一个字符串而不是整数。
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [10,2]
 * 输出："210"
 * 示例 2：
 * <p>
 * 输入：nums = [3,30,34,5,9]
 * 输出："9534330"
 */
public class LargestNumber {
    /**
     * 1、mapToObj转换成string
     * 2、sorted 排序 s2+s1 s1+s2比较
     * 3、reduce 拼接
     */
    public static String largestNumber1(int[] nums) {
        String res = Arrays.stream(nums).mapToObj(new IntFunction<String>() {
            @Override
            public String apply(int value) {
                return String.valueOf(value);
            }
        }).sorted(new Comparator<String>() {
            /**
             *默认是降序，返回值大于0，结果：降序
             * 小于0，结果升序
             * s1 表示第二个元素，s
             */
            @Override
            public int compare(String s1, String s2) {
                return (s2 + s1).compareTo(s1 + s2);
            }
        }).reduce("", (total, next) -> {
            return total + next;
        });
        return res.charAt(0) == '0' ? "0" : res;

    }

    /**
     * 简写
     */
    public static String largestNumber2(int[] nums) {
        String res = Arrays.stream(nums)
                .mapToObj(String::valueOf)
                .sorted((s1, s2) ->
                        (s2 + s1).compareTo(s1 + s2)
                )
                .reduce("", (total, next) -> total + next);
        return res.charAt(0) == '0' ? "0" : res;

    }

    public static String largestNumber3(int[] nums) {
        String res = Arrays.stream(nums)
                .mapToObj(String::valueOf)
                .sorted((s1, s2) ->
                        (s2 + s1).compareTo(s1 + s2))
                .collect(Collectors.joining(""));
        return res.charAt(0) == '0' ? "0" : res;

    }

    public static void main(String[] args) {

        // int nums[] = {3, 30, 34, 5, 9};
        int nums[] = {3, 1, 2};

        String result = largestNumber3(nums);
        System.out.println(result);
    }
}
